﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.Runtime.InteropServices;

namespace LED_Editor
{
    //public class ResizablePanel:Panel
    //{
    //    public ResizablePanel()
    //    {
    //        this.MouseHover += new EventHandler(ResizablePanel_MouseHover);
    //    }

    //    void ResizablePanel_MouseHover(object sender, EventArgs e)
    //    {
    //        Point point = MousePosition;
    //    }
    //}


    public class ResizablePanel : Panel
    {

        private Boolean _ResizeParent;



        private class NativeCalls
        {

            [DllImport("USER32.DLL", EntryPoint = "SendMessage")]

            public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref int lParam);

            [DllImport("user32")]

            public static extern int ReleaseCapture(IntPtr hwnd);

            public const int WM_SYSCOMMAND = 0x0112;

            public const int SC_DRAGMOVE = 0xF012;

            public const int SC_DRAGSIZE_N = 0xF003;

            public const int SC_DRAGSIZE_S = 0xF006;

            public const int SC_DRAGSIZE_E = 0xF002;

            public const int SC_DRAGSIZE_W = 0xF001;

            public const int SC_DRAGSIZE_NW = 0xF004;

            public const int SC_DRAGSIZE_NE = 0xF005;

            public const int SC_DRAGSIZE_SW = 0xF007;

            public const int SC_DRAGSIZE_SE = 0xF008;

        }



        public Boolean ResizeParent
        {

            get { return _ResizeParent; }

            set { _ResizeParent = value; }

        }



        public ResizablePanel()
        {

            //base.InitializeComponent(); 

            MinimumSize = new Size(50, 50);

            Margin = new Padding(0, 0, 0, 0);

            Padding = new Padding(0, 0, 3, 3);

            BackColor = SystemColors.ControlLight;

        }



        private enum MousePos { NoWhere, Right, Bottom, BottomRight }



        private MousePos GetMousePos(Point location)
        {

            MousePos result = MousePos.NoWhere;



            Rectangle TestRect;



            int RightSize = Padding.Right;

            int BottomSize = Padding.Bottom;



            // Resize right border 

            TestRect = new Rectangle(Width - RightSize, 0, Width - RightSize, Height - BottomSize);

            if (TestRect.Contains(location)) result = MousePos.Right;



            // Resize bottom border 

            TestRect = new Rectangle(0, Height - BottomSize, Width - RightSize, Height);

            if (TestRect.Contains(location)) result = MousePos.Bottom;



            // Resize bottom Corner 

            TestRect = new Rectangle(Width - RightSize, Height - BottomSize, Width, Height);

            if (TestRect.Contains(location)) result = MousePos.BottomRight;

            return result;

        }



        protected override void OnMouseDown(MouseEventArgs e)
        {

            base.OnMouseDown(e);



            IntPtr hwnd = this.Handle;



            if ((ResizeParent) && (this.Parent != null) && (this.Parent.IsHandleCreated))
            {

                hwnd = Parent.Handle;

            }



            int nul = 0;

            MousePos mousePos = GetMousePos(e.Location);

            switch (mousePos)
            {

                case MousePos.Right:
                    {

                        NativeCalls.ReleaseCapture(hwnd);

                        NativeCalls.SendMessage(hwnd, NativeCalls.WM_SYSCOMMAND, NativeCalls.SC_DRAGSIZE_E, ref nul);

                    } break;

                case MousePos.Bottom:
                    {

                        NativeCalls.ReleaseCapture(hwnd);

                        NativeCalls.SendMessage(hwnd, NativeCalls.WM_SYSCOMMAND, NativeCalls.SC_DRAGSIZE_S, ref nul);

                    } break;

                case MousePos.BottomRight:
                    {

                        NativeCalls.ReleaseCapture(hwnd);

                        NativeCalls.SendMessage(hwnd, NativeCalls.WM_SYSCOMMAND, NativeCalls.SC_DRAGSIZE_SE, ref nul);

                    } break;

            }



        }



        protected override void OnMouseMove(MouseEventArgs e)
        {

            base.OnMouseMove(e);



            MousePos mousePos = GetMousePos(e.Location);

            switch (mousePos)
            {

                case MousePos.Right: Cursor = Cursors.SizeWE; break;

                case MousePos.Bottom: Cursor = Cursors.SizeNS; break;

                case MousePos.BottomRight: Cursor = Cursors.SizeNWSE; break;

                default: Cursor = Cursors.Default; break;

            }

        }



        protected override void OnResize(EventArgs eventargs)
        {
            base.OnResize(eventargs);
            if (this.Width < this.MinimumSize.Width) this.Width = this.MinimumSize.Width;
            if (this.Height < this.MinimumSize.Height) this.Height = this.MinimumSize.Height;
        }



        protected override void OnMouseLeave(EventArgs e)
        {

            base.OnMouseLeave(e);

            Cursor = Cursors.Default;

        }

    }
}

